from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.utils import timezone
from django.core.exceptions import ObjectDoesNotExist
from .models import Wachtag
from . import einstellungen


def crew(request):
    if lastWachtagisOver(): # falls der letzte Wachtag beendet wurde, Setup für einen neuen einleiten
        return neuerWachtag(request)
    else:
        return aktuellerWachtag(request)
    



def neuerWachtag(request, addContext = {}): # view für Setup von neuen Wachtag
    context = {
        "users": User.objects.all(),
        "alert_box_level": "danger", # Farbe von eventuellen Alerts, zum Overriden über addContext
    }
    # https://stackoverflow.com/questions/38987/how-to-merge-two-dictionaries-in-a-single-expression/26853961#26853961
    context = {**context, **addContext}
    return HttpResponse(render(request, "crew/setup_crew.html", context))
    


def aktuellerWachtag(request, addContext = {}):
    auswahl = Wachtag.objects.latest()
    users = list(auswahl.users.all())
    userString = ""
    for index, user in enumerate(users):
        userString += user.username
        if not index == len(users) - 1:
            userString += ", "
    context = {
            "Wachtag": auswahl,
            "Teilnehmer": userString,
    }
    context = {**context, **addContext}
    return HttpResponse(render(request, "crew/wachtag.html", context))


def lastWachtagisOver(): # könnte man kürzer fassen, aber zur Verständlichkeit
    try:
        if Wachtag.objects.latest().dateStopped: # falls noch kein dateStopped eingetragen wurde, ist der Wert NULL und somit nicht beendet
            return True
        else:
            return False
    except ObjectDoesNotExist:
        return True # Wenn kein Wachtag existiert ist der letzte Wachtag auch vorbei


def addWachtag(request): # URL an die der POST mit den Daten für einen neuen Wachtag geht
    if not request.user.is_authenticated:
 # nicht eingeloggte werden weggeleitet
        return render(request, 'index/login_error.html')
    if not lastWachtagisOver(): # erneut prüfen ob ein Wachtag läuft, falls die URL direkt aufgerufen wurde.
        return neuerWachtag(request, {"error_message": einstellungen.ErrMsgs.runningWachtag}) # TODO IMPORTANT use redirect instead!
    # hier die checks einfügen ob es einen Wachleiter gibt, genug Leute, etc
    wachtagUsers = request.POST.getlist('wachtagUsers')
    if len(wachtagUsers) < einstellungen.MINIMUM_USERS_FOR_WACHTAG:
        return neuerWachtag(request, {"error_message": einstellungen.ErrMsgs.tooFewUsers}) # TODO IMPORTANT use redirect instead!
    # TODO: Vllt überprüfen ob es zu früh/zu spät ist? Hier erst bei Verantwortlichen erkundigen.
    # TODO: hier vielleicht überprüfen ob alle ausgewählten Wachgänger auch vorhanden sind? Vorerst aber nicht notwendig
    newWachtag = Wachtag() # neuen Wachtag erstellen
    newWachtag.save()# und diesen Speichern.
    try: # hier werden die Nutzer in den Wachtag als Teilnehmer eingetragen. Das wird nach der Speicherung gemacht, da für das ManyToManyField die betroffenen Objekte existieren müssen.
        for user in wachtagUsers:
            user = User.objects.get(username=user)
            newWachtag.users.add(user)
    except Exception as e: # Sämtliche Exceptions als Fehler abgreifen, besonders falls ein nicht vorhandener User mitgeschickt wurde (zB durch künstlichen POST)
        newWachtag.delete() # Wachtag löschen, da dieser nicht erfolgreich erstellt wurde.
        return neuerWachtag(request, {"error_message": "Interner Fehler\n:" + str(e)})
    # wenn Wachtag erfolgreich erstellt wurde, leite zurück zu crew # TODO IMPORTANT use redirect instead!
    return redirect("crew:crew")

def endWachtag(request): # TODO: extensive testing of this part
    if not request.user.is_authenticated:
 # nicht eingeloggte werden weggeleitet
        return render(request, 'index/login_error.html')
    if lastWachtagisOver(): # prüfen der letzte Wachtag schon vorbei ist, zB wenn die Seite neugeladen wird, oder die URL direkt aufgerufen wird
        return neuerWachtag(request, {"error_message": einstellungen.ErrMsgs.noRunningWachtag})
    auswahl = Wachtag.objects.latest()
    now = timezone.now()
    # Test if it's still the same day as dateStarted, if not, set dateStopped to same day 19:00
    if not auswahl.dateStarted.date() == now.date():
        auswahl.dateStopped = auswahl.dateStarted.replace(hour=19, minute=0, second=0, microsecond=0)
        auswahl.save()
        return neuerWachtag(request,{"error_message": einstellungen.ErrMsgs.lastWachtagNotEnded, "alert_box_level": "warning"})
    # also check if dateStarted is later than that, if yes 
    auswahl.dateStopped = now
    auswahl.save()
    # zurück zur Hauptcrewseite
    return neuerWachtag(request,{"error_message": einstellungen.ErrMsgs.lastWachtagSuccessfullyEnded, "alert_box_level": "info"}) #TODO use kwargs instead? # TODO IMPORTANT use redirect instead!
